﻿#pragma once
#include <GLES3/gl3.h>
#include "Transform.h"

/**
MatrixBuffer是底层openGL变换矩阵缓冲对象.
它用于保存变换矩阵.
*/
class MatrixBuffer
{
public:
    /**
    构造函数
    @param semantic 着色器中的变量索引
    @param count 矩阵数量
    @param usage 数据更新模式
    */
    static MatrixBuffer* create(GLuint semantic, unsigned int count = 1, GLenum usage = GL_STATIC_DRAW);

    /**
    更新矩阵数据
    @param matrix 索引数据的指针
    @param pos 矩阵索引
    */
    void updateMatrix(const void* matrix, unsigned int pos = 0);

    /**
    获取索引缓冲区的openGL句柄
    */
    GLuint getVBO() const;

    /**
    激活
    */
    void use();

    MatrixBuffer();
    virtual ~MatrixBuffer();

protected:
    /**
    初始化矩阵缓冲区
    @param semantic 着色器中的变量索引
    @param size 矩阵的大小(以字节为单位)
    @param usage 数据更新模式
    */
    bool init(GLint semantic, int size, GLenum usage = GL_STATIC_DRAW);

    GLint _semantic;
    mutable GLuint _vbo;
    int _size;
    GLenum _usage;
};
